package com.superme.filemanager.listener;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.superme.common.constant.Constants;
import com.superme.common.util.DateUtil;
import com.superme.filemanager.config.MinioConfig;
import com.superme.filemanager.mapper.FileMapper;
import com.superme.filemanager.pojo.entity.DeleteFile;
import com.superme.filemanager.pojo.entity.FileInfo;
import com.superme.filemanager.utils.MinioUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.Date;

/**
 * 描述: 消息对联监听
 * 作者: yanruizhi
 * 时间: 2023/5/24 17:10
 */
@Component
@Slf4j
public class RabbitMqListener {

    @Resource
    private FileMapper fileMapper;

    @Resource
    private MinioUtils minioUtils;

    @Resource
    private MinioConfig minioConfig;

    /**
     * 删除文件-监听-删除后文件保留30天，到期删除文件信息与文件对象
     *
     * @param result 文件信息json字符串
     */
    @Transactional(rollbackFor = Exception.class)
    @RabbitListener(queuesToDeclare = @Queue(Constants.DELAY_QUEUE_NAME))
    public void deleteFile(Message result) {
        String json = translateJson(result);
        DeleteFile deleteFile = JSON.parseObject(json, DeleteFile.class);
        if (deleteFile == null) {
            return;
        }
        log.info("监听到消息队列消息：time：{}，message：{}，消息创建时间：{}", DateUtil.parseDate(new Date()), json, DateUtil.parseDate(deleteFile.getCreateTime()));
        // 查询并删除文件信息
        FileInfo fileInfo = fileMapper.selectById(deleteFile.getFileInfoId());
        if (fileInfo == null) {
            return;
        }
        // 删除文件信息
        fileMapper.deleteById(fileInfo.getId());
        if (StringUtils.isEmpty(fileInfo.getObjectName())) {
            //删除文件对象
            minioUtils.removeFile(minioConfig.getBucketName(), fileInfo.getObjectName());
            log.info("文件对象：{} 已删除", fileInfo.getObjectName());
        }
    }


    // 消息消费者 queuesToDeclare表示没有该队列，自动创建
    /*
      demo
      @param message 消息体
     * @param channel 通道
     * @param s 实际发送的消息
     * @throws IOException
     */
/*    @RabbitListener(queuesToDeclare = @Queue(DelayedMqConfig.DELAY_QUEUE_NAME))
    public void consumer08(Message message, Channel channel, String s) throws IOException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(sdf.format(new Date()) + s);
        MessageProperties properties = message.getMessageProperties();
        long tag = properties.getDeliveryTag();
        log.info(Arrays.toString(message.getBody()));
        channel.basicAck(tag, false);//确认机制
    }*/

    /**
     * 将包含转义字符的 JSON 字符串转换为标准 JSON 格式的字符串。
     *
     * @param result 可能包含转义字符的 JSON 字符串
     * @return 标准格式的 JSON 字符串
     */
    public String translateJson(Message result) {
        String jsonString = new String(result.getBody());
        String substring;
        if (jsonString.startsWith("\"") && jsonString.endsWith("\"")) {
            substring = jsonString.substring(1, jsonString.length() - 1);
            substring = substring.replace("\\", "");
            return substring;
        }
        substring = jsonString.substring(1, jsonString.length() - 1);
        return substring;
    }
}
